#include "head.h"
#include "tcp.h"


int ctl = 1; // 用来控制 进程是否退出 

// UDP 客户端初始化
// struct sockaddr_in UDP_Init_Client(in_port_t port, const char *s_addr , int * sock);

// TCP 客户端初始化
int TCP_Init_client(in_port_t port, const char *s_addr);
void TCP_close_server(TCP_socket  * TCP_server_soc , int * TCP_client_soc);

// 聊天线程
void *pthread_read(void * soc);
void *pthread_write(void * soc);

// 关闭套接字文件
// void UDP_close(int  UDP_soc);


int main(int argc, char const *argv[])
{
    
    ERRLOG("Hello, all students of HQYJ_24071!\n");

    if (3 != argc)
    {
        printf("格式: %s IP地址 端口号\n", argv[0]);
        exit(-1);
    }

    // 建立连接
    int sok_fd = TCP_Init_client(atoi(argv[2]), argv[1]);

    // 初始化 TCP 客户端用于单聊文件传输
    int sock = 0;
    struct sockaddr_in soc_addr_in;

    // // 初始化UDP客户端用于文件传输  
    // int sock = 0;
    // struct sockaddr_in server_add = UDP_Init_Client(atoi(argv[2]), argv[1], &sock);

    // 启动聊天线程
    printf(" ============== 开始狗叫 ============= \n");

    pthread_t Tid[2];

    pthread_create( &Tid[0] , NULL , pthread_read , (void *)&sok_fd );
    pthread_create( &Tid[1] , NULL , pthread_write , (void *)&sok_fd );

    // 应答信息结构体
    file_data File_DATA;
    memset(&File_DATA, 0, sizeof(File_DATA));
    ARGV_IF(argc, 3);

    // 发送连接请求
    File_DATA.SYN = 1;
    sendto(sock, &File_DATA, sizeof(file_data), 0, (struct sockaddr *)&soc_addr_in, sizeof(soc_addr_in));

    // 接收文件内容
    recvfrom(sock, &File_DATA, sizeof(File_DATA), 0, NULL, NULL);

    if (File_DATA.num > 2)
    {
        printf("%s\n", File_DATA.buff);
    }

    // 选择文件
    memset(&File_DATA, 0, sizeof(File_DATA));
    printf("请输入你要下载的文件名:");
    char file_name[128];
    scanf("%s", file_name);

    // 发送你选择的文件名
    if (NULL != strstr(file_name, File_DATA.buff))
    {
        sendto(sock, file_name, sizeof(file_name), 0, (struct sockaddr *)&soc_addr_in, sizeof(soc_addr_in));
    }

    // 接受文件信息 并回发文件长度
    int fd = open(file_name, O_RDWR | O_CREAT | O_TRUNC, 0666);

    while (1)
    {
        memset(&File_DATA, 0, sizeof(File_DATA));
        // 接受
        recvfrom(sock, &File_DATA, sizeof(File_DATA), 0, NULL, NULL);
        write(fd, File_DATA.buff, strlen(File_DATA.buff));

        // 给服务器发确认信号
        File_DATA.num = strlen(File_DATA.buff);
        printf("客户端 :%d = \n" , File_DATA.num);
        sendto(sock , &File_DATA , sizeof(file_data) , 0 ,(struct sockaddr * ) & soc_addr_in , sizeof(soc_addr_in));

        if (1024 > File_DATA.num)
        {
            printf("下载完成\n");
            break;
        }
    }

    // 等待聊天线程结束
    pthread_join( Tid[0] , NULL );
    pthread_join( Tid[1] , NULL );

    // 关闭连接
    TCP_close_server(NULL, &sok_fd);
    

    return 0;
}

void *pthread_read(void * soc)
{
    char buf[128];
    int acc_fd = *((int *)soc);
    while (ctl)
    {
        // 接收数据
        memset(buf, 0, sizeof(buf));

        // 接收
        read(acc_fd, buf, sizeof(buf));         

        // 判断当前是否有数据
        if (strlen(buf) == 0)
        {
            continue;
        }

        // 显示数据
        printf("服务器:%s\n", buf);
        if (!strcmp(buf , "quit\n"))
        {
            ctl = 0;
            return NULL;
        }
        
    }
    return NULL;

}

void *pthread_write(void * soc)
{
    char buf[128];
    int acc_fd = *((int *)soc);
    while (ctl)
    {
        memset(buf, 0, sizeof(buf));
        printf("客户端:");
        fgets(buf, sizeof(buf), stdin);
        buf[strlen(buf) - 1] = '\0';

        // 发送
        write(acc_fd, buf, strlen(buf));        
        
        if (!strcmp(buf , "quit"))
        {
            ctl = 0;
            return NULL;
        }
    }
    return NULL;
}



